
package Entidades.informes;

import Control.GestorProcesamiento;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 *
 * @author Cristian Lopez
 */
public class InformeExcel extends Informe{
    private HSSFWorkbook libro;
    private HSSFSheet hoja;
    private HSSFPatriarch patriarch;

    private HSSFCellStyle style_titulo;
    private HSSFCellStyle style_subtitulo;
    private HSSFCellStyle style_parrafo;
    private HSSFCellStyle style_tabla;

    private String dir;
    private int cantFilas= 0;

    public InformeExcel(String dir){
        libro = new HSSFWorkbook();
        hoja= libro.createSheet();
        patriarch= hoja.createDrawingPatriarch();
        this.dir= dir;

        cargarEstilos();
    }

    @Override
    public boolean agregarTitulo(String texto) {
        if(texto == null || texto.isEmpty()) return false;
        HSSFRow fila = hoja.createRow(cantFilas);
        HSSFCell celda = fila.createCell(0);
        celda.setCellValue(texto);
        celda.setCellStyle(style_titulo);
        cantFilas+=2;
        return true;
    }

    @Override
    public boolean agregarSubTitulo(String texto) {
        if(texto == null || texto.isEmpty()) return false;
        HSSFRow fila = hoja.createRow(cantFilas);
        HSSFCell celda = fila.createCell(0);
        celda.setCellValue(texto);
        celda.setCellStyle(style_subtitulo);
        cantFilas+=2;
        return true;
    }

    @Override
    public boolean agregarParrafo(String texto) {
        if(texto == null || texto.isEmpty()) return false;
        HSSFRow fila = hoja.createRow(cantFilas);
        HSSFCell celda = fila.createCell(0);
        celda.setCellValue(texto);
        celda.setCellStyle(style_parrafo);
        cantFilas+=2;
        return true;
    }

    @Override
    public boolean agregarTabla(String titulo, String[] columnas, String[] filas, String[][] contenido, String descripcion) {
        hoja.addMergedRegion(new CellRangeAddress(cantFilas, cantFilas, 0, columnas.length));
        HSSFRow fila= hoja.createRow(cantFilas);
        HSSFCell cell= fila.createCell(0, HSSFCell.CELL_TYPE_STRING);
        cell.setCellValue(titulo);
        cell.setCellStyle(style_tabla);
        cantFilas++;

        fila= hoja.createRow(cantFilas);
        cell= fila.createCell(0, HSSFCell.CELL_TYPE_STRING);
        cell.setCellValue("");
        cell.setCellStyle(style_tabla);
        for(int i= 0; i< columnas.length; i++){
            cell= fila.createCell(i+1, HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(columnas[i]);
            cell.setCellStyle(style_tabla);
        }
        cantFilas++;
        
        for(int i= 0; i< contenido.length; i++){
            fila= hoja.createRow(cantFilas);
            cell= fila.createCell(0);
            cell.setCellValue(filas[i]);
            cell.setCellStyle(style_tabla);
            cantFilas++;
            for(int j= 0; j< contenido[i].length; j++){
                cell= fila.createCell(j+1);
                cell.setCellValue(contenido[i][j]);
                cell.setCellStyle(style_tabla);
            }
        }
        cantFilas+=2;

        hoja.autoSizeColumn(0);

        return true;
    }

    @Override
    public boolean agregarTabla(String titulo, String columnas[], String filas[], double contenido[][], String descripcion){
        String cont[][]= new String[contenido.length][contenido[0].length];

        for(int i= 0; i<cont.length; i++)
            for(int j= 0; j<cont[i].length; j++)
                cont[i][j]= String.valueOf(GestorProcesamiento.getDecimal(4, contenido[i][j]));

        return agregarTabla(titulo, columnas, filas, cont, descripcion);
    }

    @Override
    public boolean agregarImagen(String dirImagen) {
        try{
            byte[] picData = null;
            File pic = new File(dirImagen);
            long length = pic.length();
            picData = new byte[(int)length];
            FileInputStream picIn = new FileInputStream(pic);
            picIn.read(picData);
            int index= libro.addPicture( picData, HSSFWorkbook.PICTURE_TYPE_JPEG );

            HSSFClientAnchor anchor;
            anchor = new HSSFClientAnchor(500,100,600,200,(short)0,cantFilas,(short)10,cantFilas+10);
            anchor.setAnchorType(2);

            patriarch.createPicture(anchor, index);
        } catch (IOException e){ return false;
        } catch (Exception e){ return false; }
        cantFilas+=2;
        return true;
    }

    @Override
    public void nuevaPagina() {
        hoja= libro.createSheet();
        cantFilas= 0;
    }

    @Override
    public void cerrarEdicionDocumento() {
        try{
            FileOutputStream arch = new FileOutputStream(dir);
            libro.write(arch);
            arch.close();
        } catch(Exception e){}
    }

    private void cargarEstilos(){
        HSSFFont fuente= libro.createFont();
        fuente.setFontHeightInPoints((short)12);
        fuente.setFontName(HSSFFont.FONT_ARIAL);
        fuente.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        style_titulo= libro.createCellStyle();
        style_titulo.setWrapText(true);
        style_titulo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style_titulo.setFont(fuente);

        fuente.setFontHeightInPoints((short)11);
        style_subtitulo= libro.createCellStyle();
        style_subtitulo.setWrapText(true);
        style_subtitulo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style_subtitulo.setFont(fuente);

        fuente.setFontHeightInPoints((short)10);
        style_parrafo= libro.createCellStyle();
        style_parrafo.setWrapText(true);
        style_parrafo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style_parrafo.setFont(fuente);

        style_tabla= libro.createCellStyle();
        style_tabla.setWrapText(true);
        style_tabla.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style_tabla.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style_tabla.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style_tabla.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style_tabla.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style_tabla.setFont(fuente);
    }
}
